package com.springboot.file.param.resp;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import java.io.Serializable;

/**
 * Excel导出响应对象
 */
@Data
@ApiModel(description = "导出Excel响应参数")
@ToString(exclude = {"fileContent"}) // 排除大型内容以避免日志占用过多空间
@JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知属性
public class ExportExcelResp implements Serializable {
    
    private static final long serialVersionUID = 1L;

    /**
     * 二进制格式的文件内容
     * 直接使用此字段存储二进制数据
     */
    @ApiModelProperty("二进制格式的文件内容")
    private byte[] fileContent;

    @ApiModelProperty("文件名")
    private String fileName;

    @ApiModelProperty("文件类型")
    private String fileType;

    @ApiModelProperty("文件大小")
    private Long fileSize;

    @ApiModelProperty("文件下载地址")
    private String fileUrl;
    
    /**
     * 导出ID，唯一标识一次导出
     * 可用于后续的文件清理
     */
    @ApiModelProperty("导出ID")
    private String exportId;

    /**
     * 是否是分块模式
     * 当文件超大需要分块下载时，此字段为true
     */
    @ApiModelProperty("是否是分块模式")
    private Boolean chunkedMode = false;

    /**
     * 分块ID，唯一标识一次分块导出的所有块
     * 只在chunkedMode=true时有效
     */
    @ApiModelProperty("分块ID")
    private String chunkId;

    /**
     * 当前块序号，从0开始
     * 只在chunkedMode=true时有效
     */
    @ApiModelProperty("当前块序号")
    private Integer chunkIndex;

    /**
     * 总块数
     * 只在chunkedMode=true时有效
     */
    @ApiModelProperty("总块数")
    private Integer totalChunks;

    /**
     * 是否是最后一块
     * 只在chunkedMode=true时有效
     */
    @ApiModelProperty("是否是最后一块")
    private Boolean isLastChunk = false;
    
    /**
     * 是否是多文件导出模式
     * 当数据量超大时，需要拆分为多个Excel文件导出
     */
    @ApiModelProperty("是否是多文件导出模式")
    private Boolean isMultiFileExport = false;
    
    /**
     * 多文件导出的文件总数
     * 只在isMultiFileExport=true时有效
     */
    @ApiModelProperty("多文件导出的文件总数")
    private Integer totalFiles = 1;
    
    /**
     * 当前文件的索引，从1开始
     * 只在isMultiFileExport=true时有效
     */
    @ApiModelProperty("当前文件索引")
    private Integer fileIndex = 1;
    
    /**
     * 是否是打包的ZIP文件
     * 当开启自动打包时，多个Excel文件会被打包成一个ZIP文件
     */
    @ApiModelProperty("是否是打包的ZIP文件")
    private Boolean isPackagedZip = false;
    
    /**
     * 无参构造函数
     */
    public ExportExcelResp() {
        // 初始化默认值，避免空指针
        this.fileContent = new byte[0];
        this.fileName = "";
        this.fileType = "xlsx";
        this.fileSize = 0L;
        this.exportId = "";
        this.chunkedMode = false;
        this.chunkId = "";
        this.chunkIndex = 0;
        this.totalChunks = 1;
        this.isLastChunk = false;
        this.isMultiFileExport = false;
        this.totalFiles = 1;
        this.fileIndex = 1;
        this.isPackagedZip = false;
    }
    
    /**
     * 设置文件内容并同时更新文件大小
     * 
     * @param content 二进制内容
     * @return 当前对象，用于链式调用
     */
    public ExportExcelResp withFileContent(byte[] content) {
        if (content != null) {
            this.fileContent = content;
            this.fileSize = (long) content.length;
        } else {
            this.fileContent = new byte[0];
            this.fileSize = 0L;
        }
        return this;
    }
    
    /**
     * 检查文件内容是否有效
     * 
     * @return 如果文件内容不为null且长度大于0则返回true
     */
    public boolean hasValidContent() {
        return this.fileContent != null && this.fileContent.length > 0;
    }
    
    /**
     * 返回toString时的安全版本（不包含文件内容）
     */
    public String toLogString() {
        return "ExportExcelResp{" +
                "fileName='" + fileName + '\'' +
                ", fileType='" + fileType + '\'' +
                ", fileSize=" + fileSize +
                ", chunkedMode=" + chunkedMode +
                ", chunkId='" + chunkId + '\'' +
                ", chunkIndex=" + chunkIndex +
                ", totalChunks=" + totalChunks +
                ", isLastChunk=" + isLastChunk +
                ", isMultiFileExport=" + isMultiFileExport +
                ", totalFiles=" + totalFiles +
                ", fileIndex=" + fileIndex +
                ", fileContent.length=" + (fileContent != null ? fileContent.length : 0) +
                '}';
    }
}
